package com.xue.zuoye0221;

import java.io.File;
import java.io.FileFilter;
import java.util.Scanner;

/*
*  1、输入一个目录地址，打印该目录下的所有的文件信息，
*       如果还有子目录，继续递归打印该目录下文件信息；（递归）
*  2、在第1题基础之上，输入一个关键字，只显示包含该关键字的文件信息；
*  3、课堂练习进行编码；

*
* */

public class Task1 {
    public static void main(String[] args) {
        test02();
    }
    /**
     * 输入一个目录，遍历该目录下的所有的文件信息（递归）
     */
    private static void test01() {
        // 输入方法
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入文件信息：");
        String s = new String(scanner.nextLine());
        // 输入的字符串s就是文件的路径字符串
        File file = new File(s);
        // 对file调用递归方法
        recurrenceDir(file);
    }

    /**
     * 递归文件遍历
     *
     * @param file
     */
    private static void recurrenceDir(File file) {
        // 1 必须有结束的方式或条件（自然结束退出）
        // 2 自调用过程（自己调用自己）

        // 判断file是否为空
        if (file.exists()) {
            // 判断file是否为文件
            if (file.isFile()) {
                // file是文件，则输出文件的绝对路径
                System.out.println("文件：" + file.getAbsolutePath());
            } else if (file.isDirectory()) { // 判断file是不是目录
                // 如果是目录，则输出目录的信息
                System.out.println("目录：" + file.getAbsolutePath());
                // 取出该目下的所有的文件对象
                File[] subFiles = file.listFiles();
                // 递归遍历当前目录下的每一个子文件对象
                for (File subFile : subFiles) {
                    // 递归调用，进行子文件的遍历
                    recurrenceDir(subFile);
                }
            }
        }
    }

    /**
     * 输入一个目录，遍历该目录下的所有的文件信息（递归）
     * 并且根据录入的关键字信息，进行文件筛选
     */
    private static void test02() {
        // 输入方法
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入文件信息：");
        String s = new String(scanner.nextLine());
        System.out.println("请输入关键字：");
        // string存放关键字
        String strKW = new String(scanner.nextLine());
        // 输入的字符串s就是文件的路径字符串
        File file = new File(s);
        // 对file调用递归方法
        recurrenceDirWithSearch(file, strKW);
    }

    /**
     * 递归文件遍历,并根据关键字进行查找
     *
     * @param file     遍历的目录
     * @param keyWords 查找的关键字
     */
    private static void recurrenceDirWithSearch(File file, String keyWords) {
        // 1 必须有结束的方式或条件（自然结束退出）
        // 2 自调用过程（自己调用自己）

        // 判断file是否为空
        if (file.exists()) {
            // 判断file是否为文件
            if (file.isFile()) {
                // file是文件，则输出文件的绝对路径
                System.out.println("文件：" + file.getAbsolutePath());
            } else if (file.isDirectory()) { // 判断file是不是目录
                // 如果是目录，则输出目录的信息
                //System.out.println("目录：" + file.getAbsolutePath());
                // 取出该目下的所有的文件对象
                // 使用文件过滤器接口对存入File数组结果中的文件对象进行筛选
                // 文件过滤器接口中的accept方法，如果返回true，
                // 则子文件就会保存在结果数组中，否则不在结果数组中
                File[] subFiles = file.listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        // 文件过滤处理
                        if (pathname.isDirectory()) {
                            // 目录直接返回true，不进行过滤处理
                            return true;
                        } else {
                            // 针对文件名进行过滤
                            // 判断当前文件是否满足筛选条件，如果满足则返回true，就会包括在结果数组中
                            if (pathname.getName() != null && pathname.getName().contains(keyWords)) {
                                return true;
                            } else {
                                // 如果不满筛选条件，则返回false，则该文件不包含在结果数组中
                                return false;
                            }
                        }
                    }
                });
                // 递归遍历当前目录下的每一个子文件对象
                for (File subFile : subFiles) {
                    // 递归调用，进行子文件的遍历
                    recurrenceDir(subFile);
                }
            }
        }
    }


}
